#pragma once
#include <vector>
#include <fstream>
#include <iostream>
#include "LZWDictionary.h"
#include "Exceptions.h"
#include "BitStream.h"

using namespace std;

class LZW
{
	LZWDictionary * dic;
	BitStream bs;

	FILE *fileSource, *fileOutput;
    unsigned char *psour;	// source pointer
    unsigned char *pout;	// ouput pointer
    unsigned long psourSize, poutSize;
    const char * fileNameInput, *fileNameOutput;
protected:

	/**
	 * Funcao que armazena os dados
	 */
	void store();

	/**
	 * Funcao que carrega os dados
	 */
	void load();
public:
	/**
	 * Construtor da classe LZW
	 *
	 * @param: fileNameSource, const char, que representa o nome do ficheiro com o qual vamos trabalhar
	 * @param: fileNameutput, const char, que representa o nome do ficheiro onde quero o resultado
	 */
	LZW(const char *fileNameSource, const char *fileNameOutput);

	/**
	 * Destrutor da classe LZW
	 */
	virtual ~LZW();

	/**
	 * Funcao que comprime o ficheiro
	 */
	void compress();

	/**
	 * Funcao que descomprime o ficheiro
	 */
	void decompress();

    /**
     * Funcao que nos indica o tamanho de um ficherio
     *
     * @param: fp ficheiro do qual quero saber o tamanho
     * @return int que significa o tamanho do ficheiro
     */
	static int get_file_size(FILE *fp);
};
